﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SmsVotes.DataAccess.SMS.Inbox;
using SmsVotes.DataAccess.Properties;

namespace SmsVotes.DataAccess
{
    /// <summary>
    /// Класс для работы с смс сервисами
    /// </summary>
    public class SmsServiceFacade
    {
        /// <summary>
        /// Обновляет состояние ответов (считает кол-во) в БД, анализируя внешнюю БД.
        /// Интервал между
        /// </summary>
        /// <param name="state">Состояние голосования</param>
        public static void UpdateAnswersState(VoteState state)
        {
            using (var inboxManager = new InboxManager())
            {
                string dedicatedNumber = Settings.Default.DedicatedNumber;
                // получаем от сервиса все смски пришедшие за послединие полчаса
                var messages = inboxManager.GetAll(dedicatedNumber, DateTime.UtcNow.AddMinutes(-5), DateTime.UtcNow);
                if (messages != null && messages.Length > 0)
                {
                    foreach (var mess in messages)
                    {
                        int answerID;
                        if (int.TryParse(mess.Data, out answerID))
                        {
                            var answerState = (from aState in state.AnswerStates where aState.Answer.ID == answerID select aState).FirstOrDefault();
                            if (answerState != null)
                            {
                                // проверяем уникальность принятой смски
                                if ((from sms in answerState.PhoneSMS where sms.UID == mess.ID select sms).Count() == 0)
                                {
                                    // проверяем количество голосований с одного номера
                                    if (state.Vote.MaxVotes == 0 || ((from sms in answerState.PhoneSMS where sms.Phone == mess.SourceAddress select sms).Count() <= state.Vote.MaxVotes))
                                    {
                                        answerState.PhoneSMS.Add(new PhoneSMS() { UID = mess.ID, Phone = dedicatedNumber });
                                        answerState.Votes++;
                                    }
                                }
                            }
                        }
                    }
                    StateManager.Save();
                }
            }
            
        }
    }
}
